【HDU/算法】最短路问题 杭电OJ 2544 (Dijkstra,Dijkstra+priority_queue,Floyd,Bellman_ford,SPFA)

本文详细介绍了最短路径问题中的四个经典算法:Dijkstra(包括使用priority_queue优化)、Bellman-Ford(能检测负权回路)、SPFA(Bellman-Ford的队列优化版)和Floyd(多元最短路径动态规划)。通过实例和题目链接,解析了这些算法的应用和优缺点。
摘要由CSDN通过智能技术生成

最短路径问题是图论中很重要的问题。

解决最短路径几个经典的算法

1、Dijkstra算法

单源最短路径(贪心),还有用 priority_queue 进行优化的 Dijkstra 算法。

2、bellman-ford算法

例题:【ACM】POJ 3259 Wormholes

允许负权边的单源最短路径算法

优点:可以发现负圈。缺点,时间复杂度比Dijkstra算法高。

算法流程:

(1)初始化:将除源点外的所有顶点的最短距离估计值d[v]趋于正无穷,d[start]=0

(2)迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点V中的每个顶点v的最短距离估计值逐步逼近其最短距离(运行|v|-1次)

(3)检验负权回路:判断边集E中的每一条边的两个顶点是否收敛。如果存在未收敛的顶点,则算法返回false,表明问题无解,否则算法返回true,并从源点可达的顶点v的最短距离保存在d[v]中。

Bellman-Ford(G,w,s) :boolean   //图G ,边集 函数 w ,s为源点

1        for each vertex v ∈ V(G) do        //初始化 1阶段

2            d[v] ←+∞

3        d[s] ←0;                             //1阶段结束

4        for i=1 to |v|-1 do               //2阶段开始,双重循环。

5           for each edge(u,v) ∈E(G) do //边集数组要用到,穷举每条边。

6              If d[v]> d[u]+ w(u,v) then      //松弛判断

7                 d[v]=d[u]+w(u,v)               //松弛操作   2阶段结束

8        for each edge(u,v) ∈E(G) do

9            If d[v]> d[u]+ w(u,v) then

10            Exit false

11    Exit true

 

3、SPFA

是bellman-ford + 队列优化,其实和bfs关系更密

4、floyd算法

多元最短路算法,是一个经典的动态规划算法

 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

题目大意是:已知顶点数n,边数及权值,求第1个点到第n个点的最短路的长度

有很多种解法

1、Dijkstra 

推荐博客:【算法】【ACM】深入理解Dijkstra算法(单源最短路径算法)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int INF = 9999999;
int map[105][105];
int d[105];
bool vis[105];
int N,M;

void dijkstra()
{
	int i,j,min,pos;
	for(i=1;i<N;i++)
	{
		min = INF;
		for(j=1;j<=N;j++)
		{
			if(!vis[j] && d[j]<min)
			{
				min = d[j];
				pos = j;
			}
		}
		if(min == INF)
			return ;
		vis[pos] = true;
		for(j=1;j<=N;j++)
		{
			if(!vis[j] &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值